/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uca.sisbec.helpers.gastos;

import com.uca.sisbec.beans.NameAndCarnetBean;
import com.uca.sisbec.forms.gastos.GastosForm;
import com.uca.sisbec.mapping.Gasto;
import com.uca.sisbec.mapping.GastoXBecario;
import com.uca.sisbec.mapping.GastoXBecarioId;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Alex
 */
public class GastosHelper {
    private Session session;

    public GastosHelper(Session session) {
        this.session = session;
    }
    
    public int RegistrarGasto(GastosForm gf, String usuario) {
        Gasto g = new Gasto();
        g.setConcepto(gf.getConcepto());
        g.setCantidadBecBenef(gf.getCantBecBenef());
        g.setEstado("REGISTRADO");
        g.setMonto(java.math.BigDecimal.valueOf(gf.getMonto()));
        g.setTipo(gf.getTipo());
        g.setFechaReg(getFechaActual());
        g.setFechaUltimoCambio(getFechaActual());
        g.setUsuarioUltimoCambio(usuario);
        session.save(g);
        return g.getIdGasto();
    }
    
    public void RegistrarGastoXBecario(int idGasto, String carnet) {
        GastoXBecarioId gxbid = new GastoXBecarioId();
        gxbid.setCarnet(carnet);
        gxbid.setIdGasto(idGasto);
        GastoXBecario gxb = new GastoXBecario();
        gxb.setId(gxbid);
        session.save(gxb);
    }
    
    private java.sql.Timestamp getFechaActual(){
        long timeNow = java.util.Calendar.getInstance().getTimeInMillis();
        java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
        return ts;
    }
    
    public List<Gasto> BuscarGastosDB(GastosForm form) {
        String hql = "";
        if(form.getMonto() != 0) {
            hql = "From Gasto where monto = :monto and concepto like :concepto and year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and estado = 'REGISTRADO'";    
        } else {
            hql = "From Gasto where concepto like :concepto and year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and estado = 'REGISTRADO'";
        }
        Query query = session.createQuery(hql);
        if(form.getMonto() != 0) {
            query.setDouble("monto", form.getMonto());
        }
        query.setString("concepto", "%"+form.getConcepto()+"%");
        return new ArrayList<Gasto>(query.list());
    }
    
    public Gasto BuscarGastoDB(int idG, GastosForm form) {
        Gasto g = GetGastoDB(idG);
        form.setIdGasto(g.getIdGasto());
        form.setConcepto(g.getConcepto());
        form.setMonto(g.getMonto().doubleValue());
        form.setJustificacion(g.getJustificacionCambio());
        form.setTipo(g.getTipo());
        return g;
    }
    
    public Gasto GetGastoDB(int idG) {
        Gasto g = (Gasto) session.get(Gasto.class, idG);
        return g;
    }
    
    public List<Gasto> GetGastosDelMes(String estado, int op){
        String hql = ConstruyeQueryGastos(estado,op);
        Query query = session.createQuery(hql);
        return new ArrayList<Gasto>(query.list());
    }
    
    private String ConstruyeQueryGastos(String estado, int op) {
        String selectHQL = "";
        switch(op){
            case 1: selectHQL = "From Gasto where year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and tipo = 'F' and estado = '" + estado + "'";
                    break;
            case 2: selectHQL = "From Gasto where year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and tipo = 'V' and estado = '" + estado + "'";
                    break;
            case 3: selectHQL = "From Gasto where year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and estado = '" + estado + "'";
                    break;
        }
        return selectHQL;
    }
    
    public void ModificarGastoDB(GastosForm form, String usuario) {
        Gasto g = GetGastoDB(form.getIdGasto());
        g.setEstado(form.getEstado());
        g.setJustificacionCambio(form.getJustificacion());
        g.setUsuarioUltimoCambio(usuario);
        g.setFechaUltimoCambio(getFechaActual());
        session.saveOrUpdate(g);
    }
    
    public Gasto EntregarGastoDB(int idGasto, String usuario) {
        Gasto g = GetGastoDB(idGasto);
        g.setEstado("ENTREGADO");
        g.setUsuarioUltimoCambio(usuario);
        g.setFechaUltimoCambio(getFechaActual());
        session.saveOrUpdate(g);
        return g;
    }
    
    public List<NameAndCarnetBean> ListaBecariosBenef(Integer idGasto) {
        String hql = "select new com.uca.sisbec.beans.NameAndCarnetBean(concat(b.carnet, ' - ', b.apellidos, ', ', b.nombres)) From Becario b, Gasto g, GastoXBecario gxb where g.idGasto = " + idGasto.toString() + " and g.idGasto = gxb.id.idGasto and gxb.id.carnet = b.carnet";
        Query query = session.createQuery(hql);
        return new ArrayList<NameAndCarnetBean>(query.list());
    }
    
}
